home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / switch.zip / SWM.C < prev    next >
Text File  |  1993-01-04  |  12KB  |  452 lines

  1. /*
  2.     Switch!  Copyright (C)1988-1989 By Curtis Little
  3.     All Rights Reserved
  4.  
  5.     Window Captain Jr. Library Copyright (C)1987-1989 By Curtis Little
  6.     All Rights Reserved
  7.  
  8.     YOU SHOULD SET YOUR TAB SIZE TO FOUR IF YOU WANT TO EDIT THIS!
  9.  
  10.     NOTE:  This program has been compiled and works with MSC and Turbo C.
  11.     It may work with other compilers, but I haven't tried to check.
  12. */
  13.  
  14. extern unsigned Vcol;            /* references to my screen handler funcs */
  15. extern unsigned Vline;
  16. extern unsigned Color;
  17.  
  18. #include <stdio.h>
  19. #include <string.h>
  20.  
  21. int Center( int mrow, int attr, char *mstr );
  22. int SetScreen( void );
  23. int PressAnyKey( void );
  24. int CenterBox( int mheight, int mwidth );
  25.  
  26.  
  27.  
  28. #define NUMFIELDS        4
  29. #define USE_VALID    1
  30. #define UPPER_ONLY    4
  31. #define YN_ONLY        8
  32. #define POS_ONLY    16
  33. #define INT_ONLY    32
  34. #define DONT_INIT    64
  35.  
  36. static int trow=0, lcol=0, brow=0, rcol=0, UserP=0;
  37. static char mcommand[48], mpath[48], mmbuf[4], mrbuf[2];
  38.  
  39. static int msize[NUMFIELDS] = { 46, 46, 3, 1 };
  40. static int mvali[NUMFIELDS] = { 0, UPPER_ONLY, INT_ONLY | POS_ONLY, YN_ONLY };
  41. static char *mptr[NUMFIELDS] = { mcommand, mpath, mmbuf, mrbuf };
  42.  
  43. #define BLUE        1
  44. #define WHITE        15
  45. #define LIGHTGRAY    7
  46. #define RED            4
  47. #define CYAN        3
  48.  
  49. #define OFF            0
  50. #define ON            1
  51.  
  52. #define TXCOLOR    (BLUE << 4) | LIGHTGRAY
  53.  
  54. #define TXCOLORH    TXCOLOR ^ 8
  55.  
  56. #define    ESCAPE        1
  57. #define UP_ARROW    2
  58. #define K_TAB        0x0f09
  59. #define K_BACKTAB    0x0f00
  60. #define K_DOWN        0x5000
  61. #define K_UP        0x4800
  62. #define K_BACKTAB    0x0f00
  63.  
  64. #define say(x, y, z)  v_putsa( (x), (y), TXCOLOR, (z) ); trow = x
  65.  
  66. void *malloc( );
  67. void cdecl v_putsa( int row, int col, int attr, char *string );
  68. void cdecl v_init( void );
  69. void cdecl v_cursor( int flag );
  70. void cdecl v_clw( int top, int left, int bottom, int right, int attr );
  71. void cdecl v_drawbox( int top, int left, int height, int width, int attr );
  72. void cdecl v_putcur( int row, int col );
  73. void cdecl v_cls( void );
  74. void cdecl v_saveblock( int top, int left, int height, int width, char *buff );
  75. void cdecl v_restblock( int top, int left, int height, int width, char *buff );
  76. char *v_gets( int row, int col, int attr1, int attr2, int length, char *buf, int flag, ... );
  77. void cdecl v_fillca( int row, int col, int attr, int chara, int num );
  78. void cdecl v_putca( int row, int col, int attr, int chara );
  79. void cdecl v_keyflush( void );
  80.  
  81. char *ActiveWindow = NULL;
  82.  
  83. int check_arrow( int status, int key, int fieldcode )
  84. {
  85.     if (status == 1) {
  86.         UserP = ESCAPE;
  87.         return(2);
  88.     }
  89.  
  90.     if (key == K_UP || key == K_BACKTAB) {
  91.         UserP = UP_ARROW;
  92.         return(4);
  93.     }
  94.     UserP = 0;
  95.     if (key == K_TAB || key == K_DOWN) {
  96.         return(4);
  97.     }
  98.     return(2);
  99. }
  100.  
  101. int main( void )
  102. {
  103.     int merror, mrestore, mmem, mfield;
  104.     char *mtemp, *mscreen;
  105.     char buf[80], buf1[80];
  106.  
  107.     /* initialize the variables */
  108.     merror = mrestore = mmem = 0;
  109.  
  110.     if ((mscreen=(char *)malloc(Vline * Vcol * 2))==NULL) {
  111.         printf( "Not enough memory\n" );
  112.         exit(1);
  113.     }
  114.  
  115.     /* initialize the screen functions */
  116.     v_init();
  117.  
  118.     if (Vline > 25) {
  119.         Vline = 25;                /* library for this demo has been limited */
  120.                                 /* to work in 80x25 mode only! */
  121.     }
  122.  
  123.     if (Vcol != 80) {
  124.         printf( "\nERROR:  Must be in 80x25 mode for this demo.\n" );
  125.         exit(1);
  126.     }
  127.  
  128.     v_setbox( "╔═╗║╝═╚║" );
  129.  
  130.     mcommand[0] = mpath[0] = '\0';
  131.  
  132.     mtemp = NULL;
  133.  
  134.     /* display the main screen used by this demo program */
  135.     SetScreen();
  136.     v_cursor( OFF );
  137.  
  138.     /* now display the first advertisement box */
  139.     CenterBox( 16, 69 );
  140.  
  141.     say( trow + 4,lcol + 4, "Introducing Switch!.  Switch! is a UDF designed to make your" );
  142.     say( trow+1, lcol + 4,  "programming life easier.  Switch! allows you to run any size" );
  143.     say( trow+1, lcol + 4,  "program from within your C and Assembler applications." );
  144.     say( trow+2, lcol + 4,  "Switch! makes this possible by saving the memory used by your" );
  145.     say( trow+1, lcol + 4,  "program to disk or EMS, and then freeing it making the memory" );
  146.     say( trow+1, lcol + 4,  "available to execute any standard DOS command line you specify." );
  147.     say( trow+2, lcol + 4,  "This demonstration program lets you see what Switch! does for" );
  148.     say( trow+1, lcol + 4,  "you.  Press any key to move on." );
  149.  
  150.     v_keyflush();
  151.     PressAnyKey();
  152.  
  153.     /* display the second ad box */
  154.     CenterBox( 23, 69 );
  155.  
  156.     say( trow + 4,lcol + 4, "Switch! has the following features:" );
  157.     say( trow+2, lcol + 4,  "» Works with disk or EMS (3.2+)" );
  158.     say( trow+2, lcol + 4,  "» Automatic detection of unsafe interrupts." );
  159.     say( trow+2, lcol + 4,  "» Automatically saves ALL interrupt addresses and then restores" );
  160.     say( trow+1, lcol + 4,  "  them when the child program is finished." );
  161.     say( trow+2, lcol + 4,  "» Allows you to specify the drive and/or path for the file." );
  162.     say( trow+2, lcol + 4,  "» Built in fatal error handler." );
  163.     say( trow+2, lcol + 4,  "» Saves extended file handle table." );
  164.     say( trow+2, lcol + 4,  "» Allows you to get the error level of the child process." );
  165.     say( trow+2, lcol + 4,  "» And a whole lot more, but I ran outta space here! <grin>" );
  166.     PressAnyKey();
  167.  
  168.     SetScreen();
  169.  
  170.     /* display the main data entry box */
  171.     CenterBox(17, 73);
  172.  
  173.     v_putca( trow + 12, lcol, TXCOLORH, 199 );
  174.     v_putca( trow + 14, lcol, TXCOLORH, 199 );
  175.     v_putca( trow + 12, rcol, TXCOLORH, 182);
  176.     v_putca( trow + 14, rcol, TXCOLORH, 182);
  177.     v_fillca( trow + 12, lcol + 1, TXCOLORH,  196, 71 );
  178.     v_fillca( trow + 14, lcol + 1, TXCOLORH, 196, 71 );
  179.  
  180.     Center( trow + 12, (CYAN << 4), " Last Switch! Result " );
  181.     Center( Vline - 1, (CYAN << 4), " Press ESCape to Quit " );
  182.  
  183.     /* loop to process user input until ESCape is pressed */
  184.     while (1) {
  185.         /* Now display the demo input screen */
  186.  
  187.         mrestore = getrestdir();
  188.  
  189.         strcpy( mrbuf, mrestore ? "Y" : "N" );
  190.  
  191.         if( childret() == -1)
  192.             mtemp = "N/A";
  193.         else {
  194.             mtemp = buf;
  195.             sprintf( buf, "%d   ", childret() );
  196.         }
  197.  
  198.         sprintf( buf1, "Child returned error level:  %s", mtemp );
  199.         v_putsa( trow + 13, lcol + 2, TXCOLOR, buf1 );
  200.  
  201.         /*    
  202.             Process the error value returned by Switch! now.
  203.         */
  204.         switch( merror ) {
  205.         case  0:
  206.             mtemp =  " - No problem!  Everything's cool.     ";
  207.             break;
  208.         case  8:
  209.             mtemp =  " - Not enough memory.                 ";
  210.             break;
  211.         case  3:
  212.             mtemp =  " - How wierd, I couldn't free memory. ";
  213.             break;
  214.         case  4:
  215.             mtemp =  " - Too many files are already open!   ";
  216.             break;
  217.         case  5:
  218.             mtemp =  " - Access denied? DOS is talking back ";
  219.             break;
  220.         case  6:
  221.             mtemp =  " - Can't find COMMAND.COM!            ";
  222.             break;
  223.         case  10:
  224.             mtemp =  " - No space!  (Delete something?)     ";
  225.             break;
  226.         case  11:
  227.             mtemp =  " -You'll have to buy the drive first. ";
  228.             break;
  229.         case  12:
  230.             mtemp =  " - Unable to write the file.          ";
  231.             break;
  232.         case  14:
  233.             mtemp =  " - Whoa! Too many handles!  I do 255. ";
  234.             break;
  235.         case  15:
  236.             mtemp =  " - The specified path is imaginary!   ";
  237.             break;
  238.         case  16:
  239.             mtemp = " - Specified file exists!  OVWR is OFF!";
  240.             break;
  241.         default:
  242.             if (merror > 255 ) {
  243.                 sprintf( buf1, " - Interrupt %xh would be unsafe!", merror / 256 );
  244.                 mtemp = buf1;
  245.             }
  246.             else
  247.                 mtemp =  " - I don't EVEN know what went wrong! ";
  248.         }
  249.         sprintf( buf, "Last Switch! return value:  %d%s", merror, mtemp );
  250.         v_putsa( trow + 15, lcol + 3, TXCOLOR,  buf );
  251.  
  252.         v_putsa( trow + 8, lcol + 29, TXCOLOR, "(0 for ALL)" );
  253.  
  254.         v_putsa( trow + 4, lcol + 7, TXCOLOR, "Program to Run:" );
  255.         v_putsa( trow + 4, lcol + 24, TXCOLOR, mcommand );
  256.         v_putsa( trow + 6, lcol + 3, TXCOLOR, "Path for Temp File:" );
  257.         v_putsa( trow + 6, lcol + 24, TXCOLOR, mpath );
  258.         v_putsa( trow + 8, lcol + 4, TXCOLOR, "K Memory Required:" );
  259.         v_putsa( trow + 8, lcol + 24, TXCOLOR, mmbuf );
  260.         v_putsa( trow +10, lcol + 4, TXCOLOR, "Restore Drive/Dir:" );
  261.         v_putsa( trow + 10, lcol + 24, TXCOLOR, mrbuf );
  262.  
  263.         mfield = 0;
  264.  
  265.         sprintf( mptr[2], "%d", mmem );
  266.         UserP = 0;
  267.         v_cursor( ON );
  268.  
  269.         while (1) {
  270.             v_gets( trow + 4 + (mfield * 2), lcol + 24, LIGHTGRAY << 4,
  271.                 TXCOLOR, msize[mfield], mptr[mfield], mvali[mfield] | DONT_INIT | USE_VALID,
  272.                 check_arrow );
  273.  
  274.             if (UserP == ESCAPE)
  275.                 break;
  276.  
  277.             if (mfield == 2)
  278.                 mmem = atoi( mptr[mfield] );
  279.  
  280.             /* now process the next field to go to */
  281.             if (UserP == UP_ARROW) {
  282.                 mfield--;
  283.                 if (mfield < 0)
  284.                     mfield = 0;
  285.             }
  286.             else {
  287.                 mfield++;
  288.                 if (mfield == NUMFIELDS)
  289.                     break;
  290.             }
  291.         }
  292.  
  293.         /* did user ESCape out? */
  294.         if (UserP == ESCAPE)
  295.             break;
  296.  
  297.         mrestore = (mrbuf[0] == 'Y') ? 1 : 0;
  298.  
  299.         /* set the restore directory flag */
  300.         setrestdir(mrestore);
  301.  
  302.         /* save the screen to restore after the shell */
  303.         v_saveblock( 1, 1, Vline, Vcol, mscreen );
  304.  
  305.         v_cls();
  306.  
  307.         /* Switch! out memory now.  It's that magic time! */
  308.         merror = switch_( mpath, mmem, mcommand );
  309.  
  310.         /* restore the screen */
  311.         v_restblock( 1, 1, Vline, Vcol, mscreen );
  312.     }
  313.  
  314.     /* Finally print the last screen to finish up */
  315.     SetScreen();
  316.     CenterBox( 20, 69 );
  317.     lcol = lcol + 4;
  318.  
  319.     say( trow + 4,lcol, "Switch! is setting a new standard in the memory switching" );
  320.     say( trow + 1, lcol, "world.  With all the features provided there is no doubt -" );
  321.     say( trow + 1, lcol, "Switch! is the BEST memory switching function available" );
  322.     say( trow + 1, lcol, "at any price.  After looking at what Switch! now does I'm" );
  323.     say( trow + 1, lcol, "sure you'll agree that Switch! is the one function no" );
  324.     say( trow + 1, lcol, "programmer should be without." );
  325.     say( trow + 2, lcol, "To register Switch! send $20.00* check or money order to:" );
  326.     say( trow+2,lcol+8 , "Curtis Little"  );
  327.     say( trow+1,lcol+8 , "1087 Murrietta Blvd #244" );
  328.     say( trow+1,lcol+8 , "Livermore, CA  94550" );
  329.     say( trow+1,lcol+8 , "(415) 443-6438" );
  330.     say( trow + 2, lcol, "* Offer good through 9/1/89.  Sorry, no COD orders accepted." );
  331.  
  332.     v_fillca( Vline, 1, Color, ' ', Vcol );
  333.     v_putcur( Vline - 1, 1 );
  334.  
  335.     exit(0);
  336.  
  337. }
  338.  
  339.  
  340.  
  341. /*
  342. ** CenterBox()
  343. **
  344. ** This function draws the box I use centered on the screen
  345. */
  346.  
  347. CenterBox( int mheight, int mwidth )
  348. {
  349.     int mindex;
  350.  
  351.     trow = (Vline - mheight) / 2  + 1;
  352.     brow = trow + mheight - 1;
  353.     lcol = (Vcol - mwidth) / 2 + 1;
  354.     rcol = lcol + mwidth - 1;
  355.  
  356.     v_clw( trow + 1, lcol + 1, brow - 1, rcol - 1, TXCOLOR );
  357.  
  358.     v_drawbox( trow, lcol, mheight, mwidth, TXCOLORH );
  359.     
  360.  
  361.     /** Ok now the box is drawn and the inside is cleared.  Draw the 
  362.      ** fancy stuff needed.  Start with the shadow.
  363.      */
  364.     v_fillca( brow + 1, lcol + 2, LIGHTGRAY << 4, 178, mwidth );
  365.  
  366.     /* Draw the side shadow */
  367.     for ( mindex = trow + 1; mindex <= brow; mindex++ )
  368.         v_fillca( mindex, rcol + 1, LIGHTGRAY << 4, 178, 2 );
  369.  
  370.     /* Draw in the top title for the box */
  371.     v_fillca( trow + 1, lcol + 1, TXCOLORH, 178, 6 );
  372.     v_putca( trow + 1, lcol + 7, TXCOLORH, 186 );
  373.     v_putca( trow, lcol + 7, TXCOLORH, 203 );
  374.  
  375.     v_putca( trow + 1, rcol - 7, TXCOLORH, 186 );
  376.     v_fillca( trow + 1, rcol - 6, TXCOLORH, 178, 6 );
  377.     v_putca(  trow, rcol - 7, TXCOLORH, 203 );
  378.  
  379.     v_fillca( trow + 2, lcol + 1, TXCOLORH, 196, mwidth - 2 );
  380.     v_putca( trow + 2, lcol, TXCOLORH, 199 );
  381.     v_putca( trow + 2, rcol, TXCOLORH, 182 );
  382.     v_putca( trow + 2, lcol + 7, TXCOLORH, 208 );
  383.     v_putca( trow + 2, rcol - 7, TXCOLORH, 208 );
  384.  
  385.     Center( trow + 1, RED << 4 | WHITE, " Switch!   Copyright (C)1988-89 By Curtis Little " );
  386.  
  387.     return(0);
  388. }
  389.  
  390.  
  391. /**
  392. ** PressAnyKey()
  393. **
  394. ** This function prints a banner centered on the box at the bottom line
  395. ** and pauses for a key to be pressed.
  396. */
  397.  
  398. PressAnyKey( void )
  399. {
  400.  
  401.     Center( brow, CYAN << 4, " Press Any Key To Continue " );
  402.  
  403.     return(v_getch());
  404. }
  405.  
  406.  
  407.  
  408.  
  409.  
  410. /**
  411. ** SetScreen()
  412. **
  413. ** This function sets up the screen for the demo.
  414. */
  415.  
  416. SetScreen( void )
  417. {
  418.  
  419.     v_fillca( 1, 1, LIGHTGRAY, 178, Vline * Vcol );
  420.  
  421.     Center( 1, LIGHTGRAY << 4 | BLUE, "   Switch!       ∙          C Demonstration Program          ∙       03/26/89   " );
  422.  
  423.     return(0);
  424. }
  425.  
  426.  
  427. /**
  428. ** Centered()
  429. **
  430. ** This function prints a string centered on the specified row of the screen.
  431. */
  432. Center( int mrow, int attr, char *mstr )
  433. {
  434.     v_putsa( mrow, (Vcol - strlen( mstr )) / 2 + 1, attr, mstr );
  435. }
  436.  
  437. /*
  438.     Fill in NULL functions to resolve externals referenced in the LIB that
  439.     aren't need for this demo.
  440. */
  441. int v_setfreq( )
  442. {
  443.  
  444. }
  445.  
  446. int v_delay( )
  447. {
  448. }
  449.  
  450.  
  451.  
  452.